#ifndef DEVICE_SPIKE_HELPER_H
#define DEVICE_SPIKE_HELPER_H

#include <QTimer>

#include "IDevice.h"

class ModbusManager;
class ModbusHelper;

class DeviceSpikeHelper : public IDevice
{
    Q_OBJECT
public:
    DeviceSpikeHelper(QString deviceName, QObject* parent = nullptr);
    ~DeviceSpikeHelper();
    void control(quint16 optCode) override;
    void setDeviceTime(const QDateTime& datetime) override;

    // 加标回收功能
    void startSpikeRecovery();
    float getRecoveryRate() const { return m_recoveryRate; }

private slots:
    void onGetDeviceData() override;

    // 加标回收流程相关
    void onStepTimeout();
    void pollAnalysis(int step);
    void writeConcentrationAndFinish(int step);

private:
    // 加标回收状态枚举
    enum class SpikeRecoveryStep {
        IDLE,           // 空闲
        INIT_SETTINGS,  // 步骤1: 初始化设置
        ANALYSIS1,      // 步骤2-5: 第一次分析
        ANALYSIS2,      // 步骤6-9: 第二次分析
        READING_RESULT  // 步骤10: 读取结果
    };

    // 加标回收相关方法
    void loadSpikeRecoveryConfig();
    void executeSpikeRecoveryStep();
    void step_InitSettings();
    void step_Analysis1();
    void step_Analysis2();
    void step_ReadResult();
    void executeAnalysisStep(int step, void (DeviceSpikeHelper::*retryFunc)(),
                             const QString& errorPrefix);
    void completeSpikeRecovery();
    void handleSpikeRecoveryError(const QString& error);
    void stopSpikeRecovery();
    // 动态获取ModbusHelper
    ModbusHelper* getMeasureModbus();

    // 加标回收成员变量
    ModbusManager* m_modbusManager;
    QTimer* m_stepTimer;
    QDateTime m_startTime;  // 加标回收开始时间

    SpikeRecoveryStep m_currentSpikeRecoveryStep;
    QString m_measureDeviceName;  // 关联的测量设备名称

    float m_concentration1;
    float m_concentration2;
    float m_recoveryRate;

    // 轮询基准值
    float m_baselineValue1;
    float m_baselineValue2;
    bool m_isFirstRead1;
    bool m_isFirstRead2;

    bool m_isSpikeRecoveryMode;  // 是否在加标回收模式

    static const int STEP_TIMEOUT_MS = 300000;  // 5分钟超时
};

#endif  // DEVICE_SPIKE_HELPER_H
